This moves the GDK_ALWAYS_USE_GL env var to GDK_GL=always.
It also changes GDK_DEBUG=nogl to GDK_GL=disable, as GDK_DEBUG
is really only about debug loggin.
It also adds some completely new flags:
software-draw-gl:
Always use software fallback for drawing gl content to a cairo_t.
This disables the fastpaths that exist for drawing directly to
a window and instead reads back the pixels into a cairo image
surface.
software-draw-surface:
Always use software fallback for drawing cairo surfaces onto a
gl-using window. This disables e.g. texture-from-pixmap on X11.
software-draw:
Enables both the above.
static GCallback gdk_threads_lock = NULL;
static GCallback gdk_threads_unlock = NULL;
+static const GDebugKey gdk_gl_keys[] = {
+ {"disable", GDK_GL_FLAGS_DISABLE},
+ {"always", GDK_GL_FLAGS_ALWAYS},
+ {"software-draw", GDK_GL_FLAGS_SOFTWARE_DRAW_GL | GDK_GL_FLAGS_SOFTWARE_DRAW_SURFACE},
+ {"software-draw-gl", GDK_GL_FLAGS_SOFTWARE_DRAW_GL},
+ {"software-draw-surface", GDK_GL_FLAGS_SOFTWARE_DRAW_SURFACE},
+};
+
#ifdef G_ENABLE_DEBUG
static const GDebugKey gdk_debug_keys[] = {
{"events", GDK_DEBUG_EVENTS},
{"eventloop", GDK_DEBUG_EVENTLOOP},
{"frames", GDK_DEBUG_FRAMES},
{"settings", GDK_DEBUG_SETTINGS},
- {"nogl", GDK_DEBUG_NOGL},
{"opengl", GDK_DEBUG_OPENGL},
};
gdk_pre_parse_libgtk_only (void)
{
const char *rendering_mode;
+ const gchar *gl_string;
gdk_initialized = TRUE;
}
#endif /* G_ENABLE_DEBUG */
+ gl_string = getenv("GDK_GL");
+ if (gl_string != NULL)
+ _gdk_gl_flags = g_parse_debug_string (gl_string,
+ (GDebugKey *) gdk_gl_keys,
+ G_N_ELEMENTS (gdk_gl_keys));
+
if (getenv ("GDK_NATIVE_WINDOWS"))
{
g_warning ("The GDK_NATIVE_WINDOWS environment variable is not supported in GTK3.\n"
/* For direct paint of non-alpha renderbuffer, we can
just do a bitblit */
- if (source_type == GL_RENDERBUFFER &&
+ if ((_gdk_gl_flags & GDK_GL_FLAGS_SOFTWARE_DRAW_GL) == 0 &&
+ source_type == GL_RENDERBUFFER &&
alpha_size == 0 &&
direct_window != NULL &&
direct_window->current_paint.use_gl &&
}
/* For direct paint of alpha or non-alpha textures we can use texturing */
- else if (source_type == GL_TEXTURE &&
+ else if ((_gdk_gl_flags & GDK_GL_FLAGS_SOFTWARE_DRAW_GL) == 0 &&
+ source_type == GL_TEXTURE &&
direct_window != NULL &&
direct_window->current_paint.use_gl &&
trivial_transform &&
guint target;
paint_context = gdk_gl_context_get_current ();
- if (paint_context &&
+ if ((_gdk_gl_flags & GDK_GL_FLAGS_SOFTWARE_DRAW_SURFACE) == 0 &&
+ paint_context &&
GDK_GL_CONTEXT_GET_CLASS (paint_context)->texture_from_surface &&
GDK_GL_CONTEXT_GET_CLASS (paint_context)->texture_from_surface (paint_context, surface, region))
return;
gchar *_gdk_display_name = NULL;
gchar *_gdk_display_arg_name = NULL;
gboolean _gdk_disable_multidevice = FALSE;
+guint _gdk_gl_flags = 0;
GdkRenderingMode _gdk_rendering_mode = GDK_RENDERING_MODE_SIMILAR;
GDK_DEBUG_EVENTLOOP = 1 << 10,
GDK_DEBUG_FRAMES = 1 << 11,
GDK_DEBUG_SETTINGS = 1 << 12,
- GDK_DEBUG_NOGL = 1 << 13,
- GDK_DEBUG_OPENGL = 1 << 14
+ GDK_DEBUG_OPENGL = 1 << 13,
} GdkDebugFlag;
+typedef enum {
+ GDK_GL_FLAGS_DISABLE = 1 << 0,
+ GDK_GL_FLAGS_ALWAYS = 1 << 1,
+ GDK_GL_FLAGS_SOFTWARE_DRAW_GL = 1 << 2,
+ GDK_GL_FLAGS_SOFTWARE_DRAW_SURFACE = 1 << 3,
+} GdkGLFlags;
+
+
typedef enum {
GDK_RENDERING_MODE_SIMILAR = 0,
GDK_RENDERING_MODE_IMAGE,
extern GdkWindow *_gdk_parent_root;
extern guint _gdk_debug_flags;
+extern guint _gdk_gl_flags;
extern GdkRenderingMode _gdk_rendering_mode;
#ifdef G_ENABLE_DEBUG
static GQuark quark_pointer_window = 0;
-static gboolean always_use_gl = FALSE;
-
static void
gdk_window_class_init (GdkWindowClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
- if (g_getenv ("GDK_ALWAYS_USE_GL"))
- always_use_gl = TRUE;
-
parent_class = g_type_class_peek_parent (klass);
object_class->finalize = gdk_window_finalize;
G_CALLBACK (device_removed_cb), window);
- if (always_use_gl)
+ if ((_gdk_gl_flags & (GDK_GL_FLAGS_ALWAYS | GDK_GL_FLAGS_DISABLE)) == GDK_GL_FLAGS_ALWAYS)
{
GError *error = NULL;
GdkGLContext *
gdk_window_get_paint_gl_context (GdkWindow *window, GError **error)
{
- if (_gdk_debug_flags & GDK_DEBUG_NOGL)
+ if (_gdk_gl_flags & GDK_GL_FLAGS_DISABLE)
{
g_set_error_literal (error, GDK_GL_ERROR,
GDK_GL_ERROR_NOT_AVAILABLE,